/**
 * 
 */
package org.i1510.spider.utils.spider.worker;

import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.i1510.common.utils.StringUtils;
import org.i1510.common.utils.sqliteJdbc.DbUtils;
import org.i1510.spider.bean.SysSpiderRuleBean;
import org.i1510.spider.utils.spider.fetcher.PageFetcher;
import org.i1510.spider.utils.spider.handler.ContentHandler;
import org.i1510.spider.utils.spider.model.FetchedPage;
import org.i1510.spider.utils.spider.model.SpiderParams;
import org.i1510.spider.utils.spider.parser.ContentParser2;
import org.i1510.spider.utils.spider.parser.ContentParser2_an;
import org.i1510.spider.utils.spider.queue.SpiderRuleQueue;
import org.i1510.spider.utils.spider.storage.DataStorage;
/**
 * @author Administrator
 *  获取http://segmentfault.com/questions/newest?page=1 中每一个链接对应的答案
 */
public class SpiderRuleWorker2_an implements Runnable{
	private static final Logger log = Logger.getLogger(SpiderRuleWorker2_an.class.getName());
	private PageFetcher fetcher;
	private ContentHandler handler;
	private ContentParser2_an parser;
	private DataStorage store;
	private int threadIndex;
	
	public SpiderRuleWorker2_an(int threadIndex){
		this.threadIndex = threadIndex;
		this.fetcher = new PageFetcher();
		this.handler = new ContentHandler();
		this.parser = new ContentParser2_an();
		this.store = new DataStorage();
	}
	
	@Override
	public void run() {
		// 登录
		
		
		// 当待抓取URL队列不为空时，执行爬取任务
		// 注： 当队列内容为空时，也不爬取任务已经结束了
		//     因为有可能是UrlQueue暂时空，其他worker线程还没有将新的URL放入队列
		//	        所以，这里可以做个等待时间，再进行抓取（二次机会）
		while(!SpiderRuleQueue.isEmpty()){
			// 从待抓取队列中拿URL
			SysSpiderRuleBean sysSpiderRuleBean = SpiderRuleQueue.outElement();
			String url = sysSpiderRuleBean.getUrl();
			if(!StringUtils.isStringEmpty(url)){
				// 抓取URL指定的页面，并返回状态码和页面内容构成的FetchedPage对象
				FetchedPage fetchedPage = fetcher.getContentFromUrl(url);
				
				// 检查爬取页面的合法性，爬虫是否被禁止
				if(!handler.check(fetchedPage)){
					// 切换IP等操作
					// TODO
					
					log.info("Spider-" + threadIndex + ": switch IP to ");
					continue;
				}
				
				// 解析页面，获取目标数据
				List<Map> list = parser.parse(fetchedPage,sysSpiderRuleBean);
				Map map = list.get(0);
				String sql = "";
				// 存储目标数据到数据存储（如DB）、存储已爬取的Url到VisitedUrlQueue
					sql = "insert into km_an values(?,?,?,?,?);";
					Object[] o = new Object[5];
					o[0] = sysSpiderRuleBean.getValue();
					o[1] = sysSpiderRuleBean.getUrl();
					o[2] = sysSpiderRuleBean.getKey();
					o[3] = map.get("descs");
					o[4] = map.get("answer");

				DbUtils db = new DbUtils();
				
				db.executeUpdate(sql, o);
//				store.store(targetData);
				
				
				// delay
				try {
					Thread.sleep(SpiderParams.DEYLAY_TIME);
				} 
				catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
		}
		
		fetcher.close();
		log.info("Spider-" + threadIndex + ": stop...");
	}

}
